Fix a compatibility problem
authorMatthias Clasen <mclasen@redhat.com>
Fri, 12 Feb 2010 20:45:16 +0000 (15:45 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 12 Feb 2010 23:55:42 +0000 (18:55 -0500)
It turns out that my attempt at handling Super, Hyper and Meta better
is causing problems, mostly because Alt and Meta are commonly colocated
in the modmap, and apps do a check for the Alt modifier regularly.

See e.g bug 607697.

docs/reference/gdk/gdk-sections.txt
gdk/gdk.symbols
gdk/gdkkeys.h
gdk/quartz/gdkkeys-quartz.c
gdk/win32/gdkkeys-win32.c
gdk/x11/gdkevents-x11.c
gdk/x11/gdkkeys-x11.c
gtk/gtkkeyhash.c

index 90ae3b20f682265b3507d9c668743beef903bd7c..5d05c993c8be1bb42368a66c81bb4f70d000fb15 100644 (file)
@@ -1006,6 +1006,7 @@ gdk_keymap_get_entries_for_keycode
 gdk_keymap_get_direction
 gdk_keymap_have_bidi_layouts
 gdk_keymap_get_caps_lock_state
+gdk_keymap_add_virtual_modifiers
 gdk_keymap_map_virtual_modifiers
 
 <SUBSECTION>
index 12967c425f6d52656b8c23da9ca9e4007f41b13b..67ffb0a84eda82c1345dda03907631719fa06ce4 100644 (file)
@@ -852,6 +852,7 @@ gdk_keymap_have_bidi_layouts
 gdk_keymap_get_caps_lock_state
 gdk_keymap_lookup_key
 gdk_keymap_translate_keyboard_state
+gdk_keymap_add_virtual_modifiers
 gdk_keymap_map_virtual_modifiers
 gdk_keyval_convert_case
 gdk_keyval_from_name
index 6fe55f7bb2aad978f550bb8726684d722af6b1db..a6750ce439612f7788910283f0b3aa8b6081b5f7 100644 (file)
@@ -108,6 +108,8 @@ gboolean       gdk_keymap_get_entries_for_keycode  (GdkKeymap           *keymap,
 PangoDirection gdk_keymap_get_direction            (GdkKeymap           *keymap);
 gboolean       gdk_keymap_have_bidi_layouts        (GdkKeymap           *keymap);
 gboolean       gdk_keymap_get_caps_lock_state      (GdkKeymap           *keymap);
+void           gdk_keymap_add_virtual_modifiers    (GdkKeymap           *keymap,
+                                                    GdkModifierType     *state);
 gboolean       gdk_keymap_map_virtual_modifiers    (GdkKeymap           *keymap,
                                                     GdkModifierType     *state);
 
index a277af35d11576fe8c728187a5f3185d752fa9be..52b08677a5e9f8929e33f3d298b129f17051aad4 100644 (file)
@@ -652,6 +652,13 @@ gdk_keymap_translate_keyboard_state (GdkKeymap       *keymap,
   return TRUE;
 }
 
+void
+gdk_keymap_add_virtual_modifiers (GdkKeymap       *keymap,
+                                  GdkModifierType *state)
+{
+  /* FIXME: For now, we've mimiced the Windows backend. */
+}
+
 gboolean
 gdk_keymap_map_virtual_modifiers (GdkKeymap       *keymap,
                                   GdkModifierType *state)
index 52858d1d0415640da6ccb621a98b22b7e2e7e621..eff2ebec802e6c1b37b71b28d748152a48a8a4a3 100644 (file)
@@ -872,6 +872,12 @@ gdk_keymap_translate_keyboard_state (GdkKeymap       *keymap,
   return tmp_keyval != GDK_VoidSymbol;
 }
 
+void
+gdk_keymap_add_virtual_modifiers (GdkKeymap       *keymap,
+                                  GdkModifierType *state)
+{
+}
+
 gboolean
 gdk_keymap_map_virtual_modifiers (GdkKeymap       *keymap,
                                   GdkModifierType *state)
index a9efe76af183edd6fb775eba7b37b0735fecc400..1f27497f3fb75c8f52eedc743245864852b0c816 100644 (file)
@@ -636,7 +636,7 @@ translate_key_event (GdkDisplay *display,
                                       &event->key.keyval,
                                        NULL, NULL, &consumed);
    state = event->key.state & ~consumed;
-   _gdk_keymap_add_virtual_modifiers (keymap, &state);
+   _gdk_keymap_add_virtual_modifiers_compat (keymap, &state);
    event->key.state |= state;
 
   event->key.is_modifier = _gdk_keymap_key_is_modifier (keymap, event->key.hardware_keycode);
index f7d7a9099d6e9e1b630dab36339797be3fc9b695..3863f4abe589218434c7710c511f957fe8cfa27c 100644 (file)
@@ -1657,8 +1657,8 @@ _gdk_x11_get_group_for_state (GdkDisplay      *display,
 }
 
 void
-_gdk_keymap_add_virtual_modifiers (GdkKeymap       *keymap,
-                                  GdkModifierType *modifiers)
+_gdk_keymap_add_virtual_modifiers_compat (GdkKeymap       *keymap,
+                                         GdkModifierType *modifiers)
 {
   GdkKeymapX11 *keymap_x11;
   int i;
@@ -1666,6 +1666,51 @@ _gdk_keymap_add_virtual_modifiers (GdkKeymap       *keymap,
   keymap = GET_EFFECTIVE_KEYMAP (keymap);
   keymap_x11 = GDK_KEYMAP_X11 (keymap);
 
+  for (i = 3; i < 8; i++)
+    {
+      if ((1 << i) & *modifiers)
+        {
+         if (keymap_x11->modmap[i] & GDK_MOD1_MASK)
+           *modifiers |= GDK_MOD1_MASK;
+         else if (keymap_x11->modmap[i] & GDK_SUPER_MASK)
+           *modifiers |= GDK_SUPER_MASK;
+         else if (keymap_x11->modmap[i] & GDK_HYPER_MASK)
+           *modifiers |= GDK_HYPER_MASK;
+         else if (keymap_x11->modmap[i] & GDK_META_MASK)
+           *modifiers |= GDK_META_MASK;
+        }
+    }
+}
+
+/**
+ * gdk_keymap_add_virtual_modifiers:
+ * @keymap: a #GdkKeymap
+ * @modifiers: pointer to the modifier mask to change
+ *
+ * Adds virtual modifiers (i.e. Super, Hyper and Meta) which correspond
+ * to the real modifiers (i.e Mod2, Mod3, ...) in @modifiers.
+ * are set in @state to their non-virtual counterparts (i.e. Mod2,
+ * Mod3,...) and set the corresponding bits in @modifiers.
+ *
+ * GDK already does this before delivering key events, but for
+ * compatibility reasons, it only sets the first virtual modifier
+ * it finds, whereas this function sets all matching virtual modifiers.
+ *
+ * This function is useful when matching key events against
+ * accelerators.
+ *
+ * Since: 2.20
+ */
+void
+gdk_keymap_add_virtual_modifiers (GdkKeymap       *keymap,
+                                 GdkModifierType *modifiers)
+{
+  GdkKeymapX11 *keymap_x11;
+  int i;
+
+  keymap = GET_EFFECTIVE_KEYMAP (keymap);
+  keymap_x11 = GDK_KEYMAP_X11 (keymap);
+
   for (i = 3; i < 8; i++)
     {
       if ((1 << i) & *modifiers)
index 368699cc184776d5a5e4e3c26722ea716d953239..cbe0b7747c57fbcd5adb85e09983e543c4e3bb42 100644 (file)
@@ -404,6 +404,7 @@ _gtk_key_hash_lookup (GtkKeyHash      *key_hash,
   gdk_keymap_translate_keyboard_state (key_hash->keymap,
                                       hardware_keycode, state, group,
                                       &keyval, &effective_group, &level, &consumed_modifiers);
+  gdk_keymap_add_virtual_modifiers (key_hash->keymap, &state);
 
   GTK_NOTE (KEYBINDINGS,
            g_message ("Looking up keycode = %u, modifiers = 0x%04x,\n"